package cn.gov.pbc.tims.controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.ResourceBundle;

import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;

import com.sun.mail.imap.IMAPStore;

import cn.gov.pbc.tims.util.ExcelUtil;

/**
 * 
 * @author H
 * 
 * 
 * 
 */

public class ShowMail {

	private MimeMessage mimeMessage = null;

	private String saveAttachPath = ""; // 附件下载后的存放目录

	private StringBuffer bodyText = new StringBuffer(); // 存放邮件内容的StringBuffer对象

	private String dateFormat = "yy-MM-dd HH:mm"; // 默认的日前显示格式
	
	/**
	 * 
	 * 构造函数,初始化一个MimeMessage对象
	 * 
	 */

	public ShowMail() {

	}

	public ShowMail(MimeMessage mimeMessage) {

		this.mimeMessage = mimeMessage;

		//System.out.println("创建一个ReceiveEmail对象....");

	}

	public void setMimeMessage(MimeMessage mimeMessage) {

		this.mimeMessage = mimeMessage;

		System.out.println("设置一个MimeMessage对象...");

	}

	/**
	 * 
	 * * 获得发件人的地址和姓名
	 * 
	 */

	public String getFrom() throws Exception {

		InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();

		String from = address[0].getAddress();

		if (from == null) {

			from = "";

			System.out.println("无法知道发送者.");

		}

		String personal = address[0].getPersonal();

		if (personal == null) {

			personal = "";

			System.out.println("无法知道发送者的姓名.");

		}

		String fromAddr = null;

		if (personal != null || from != null) {

			fromAddr = personal + "<" + from + ">";

			//System.out.println("发送者是：" + fromAddr);

		} else {

			//System.out.println("无法获得发送者信息.");

		}

		return fromAddr;

	}

	/**
	 * 
	 * * 获得邮件的收件人，抄送，和密送的地址和姓名，根据所传递的参数的不同
	 * 
	 * * "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址
	 * 
	 */

	public String getMailAddress(String type) throws Exception {

		String mailAddr = "";

		String addType = type.toUpperCase();

		InternetAddress[] address = null;

		if (addType.equals("TO") || addType.equals("CC")

				|| addType.equals("BCC")) {

			if (addType.equals("TO")) {

				address = (InternetAddress[]) mimeMessage

						.getRecipients(Message.RecipientType.TO);

			} else if (addType.equals("CC")) {

				address = (InternetAddress[]) mimeMessage

						.getRecipients(Message.RecipientType.CC);

			} else {

				address = (InternetAddress[]) mimeMessage

						.getRecipients(Message.RecipientType.BCC);

			}

			if (address != null) {

				for (int i = 0; i < address.length; i++) {

					String emailAddr = address[i].getAddress();

					if (emailAddr == null) {

						emailAddr = "";

					} else {

						//System.out.println("转换之前的emailAddr: " + emailAddr);

						emailAddr = MimeUtility.decodeText(emailAddr);

						//System.out.println("转换之后的emailAddr: " + emailAddr);

					}

					String personal = address[i].getPersonal();

					if (personal == null) {

						personal = "";

					} else {

						//System.out.println("转换之前的personal: " + personal);

						personal = MimeUtility.decodeText(personal);

						//System.out.println("转换之后的personal: " + personal);

					}

					String compositeto = personal + "<" + emailAddr + ">";

					//System.out.println("完整的邮件地址：" + compositeto);

					mailAddr += "," + compositeto;

				}

				mailAddr = mailAddr.substring(1);

			}

		} else {

			throw new Exception("错误的电子邮件类型!");

		}

		return mailAddr;

	}

	/**
	 * 
	 * * 获得邮件主题
	 * 
	 */

	public String getSubject() throws MessagingException {

		String subject = "";

		try {

			// System.out.println("转换前的subject：" + mimeMessage.getSubject());
			subject = mimeMessage.getSubject();
			// subject = MimeUtility.decodeText(mimeMessage.getSubject());
			// System.out.println("转换后的subject: " + mimeMessage.getSubject());

			if (subject == null) {

				subject = "";

			}

		} catch (Exception exce) {

			exce.printStackTrace();

		}

		return subject;

	}

	/**
	 * 
	 * * 获得邮件发送日期
	 * 
	 */

	public String getSentDate() throws Exception {

		Date sentDate = mimeMessage.getSentDate();

		// System.out.println("发送日期 原始类型: " + dateFormat);

		SimpleDateFormat format = new SimpleDateFormat(dateFormat);

		String strSentDate = format.format(sentDate);

		//System.out.println("发送日期 可读类型: " + strSentDate);

		return strSentDate;

	}

	/**
	 * 
	 * * 获得邮件正文内容
	 * @throws MessagingException 
	 * @throws IOException 
	 * 
	 */

	public String getBodyText() throws IOException, MessagingException {

		return  bodyText.toString();

	}

	/**
	 * 
	 * * 解析邮件，把得到的邮件内容保存到一个StringBuffer对象中，解析邮件
	 * 
	 * * 主要是根据MimeType类型的不同执行不同的操作，一步一步的解析
	 * 
	 */

	public void getMailContent(Part part) throws Exception {

		String contentType = part.getContentType();

		// 获得邮件的MimeType类型

		//System.out.println("邮件的MimeType类型: " + contentType);

		int nameIndex = contentType.indexOf("name");

		boolean conName = false;

		if (nameIndex != -1) {

			conName = true;

		}

		//System.out.println("邮件内容的类型:　" + contentType);

		if (part.isMimeType("text/plain") && conName == false) {

			// text/plain 类型

			bodyText.append((String) part.getContent());

		} else if (part.isMimeType("text/html") && conName == false) {

			// text/html 类型
			System.out.println("邮件内容html:　" + (String) part.getContent());

			//bodyText.append((String) part.getContent());

		} else if (part.isMimeType("multipart/*")) {

			// multipart/*

			Multipart multipart = (Multipart) part.getContent();

			int counts = multipart.getCount();

			for (int i = 0; i < counts; i++) {

				getMailContent(multipart.getBodyPart(i));

			}

		} else if (part.isMimeType("message/rfc822")) {

			// message/rfc822

			getMailContent((Part) part.getContent());

		} else {

		}

	}

	/**
	 * 
	 * * 判断此邮件是否需要回执，如果需要回执返回"true",否则返回"false"
	 * 
	 */

	public boolean getReplySign() throws MessagingException {

		boolean replySign = false;

		String needReply[] = mimeMessage

				.getHeader("Disposition-Notification-To");

		if (needReply != null) {

			replySign = true;

		}

		if (replySign) {

			//System.out.println("该邮件需要回复");

		} else {

			//System.out.println("该邮件不需要回复");

		}

		return replySign;

	}

	/**
	 * 
	 * 获得此邮件的Message-ID
	 * 
	 */

	public String getMessageId() throws MessagingException {

		String messageID = mimeMessage.getMessageID();

		//System.out.println("邮件ID: " + messageID);

		return messageID;

	}

	/**
	 * 
	 * 判断此邮件是否已读，如果未读返回false,反之返回true
	 * 
	 */

	public boolean isNew() throws MessagingException {

		boolean isNew = false;

		Flags flags = ((Message) mimeMessage).getFlags();

		Flags.Flag[] flag = flags.getSystemFlags();

		//System.out.println("flags的长度:　" + flag.length);

		for (int i = 0; i < flag.length; i++) {

			if (flag[i] == Flags.Flag.SEEN) {

				isNew = true;

				//System.out.println("seen email...");

				// break;

			}

		}

		return isNew;

	}

	/**
	 * 
	 * 判断此邮件是否包含附件
	 * 
	 */

	public boolean isContainAttach(Part part) throws Exception {

		boolean attachFlag = false;

		// String contentType = part.getContentType();

		if (part.isMimeType("multipart/*")) {

			Multipart mp = (Multipart) part.getContent();

			for (int i = 0; i < mp.getCount(); i++) {

				BodyPart mPart = mp.getBodyPart(i);

				String disposition = mPart.getDisposition();

				if ((disposition != null)

						&& ((disposition.equals(Part.ATTACHMENT)) || (disposition

								.equals(Part.INLINE))))

					attachFlag = true;

				else if (mPart.isMimeType("multipart/*")) {

					attachFlag = isContainAttach((Part) mPart);

				} else {

					String conType = mPart.getContentType();

					if (conType.toLowerCase().indexOf("application") != -1)

						attachFlag = true;

					if (conType.toLowerCase().indexOf("name") != -1)

						attachFlag = true;

				}

			}

		} else if (part.isMimeType("message/rfc822")) {

			attachFlag = isContainAttach((Part) part.getContent());

		}

		return attachFlag;

	}

	 
	/**
	 * 
	 * 设置附件存放路径
	 * 
	 */

	public void setAttachPath(String attachPath) {

		this.saveAttachPath = attachPath;

	}

	/**
	 * 
	 * * 设置日期显示格式
	 * 
	 */

	public void setDateFormat(String format) throws Exception {

		this.dateFormat = format;

	}

	/**
	 * 
	 * * 获得附件存放路径
	 * 
	 */

	public String getAttachPath() {

		return saveAttachPath;

	}

	 
}
